package editorsvg.editor.herramientas;

import editorsvg.editor.formas.Circulo;
import editorsvg.editor.herramientas.controles.Cruz;
import editorsvg.editor.herramientas.controles.Flecha;
import editorsvg.editor.vista.EditorDocumento;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;

/**
 * Herramienta para la insercción de circulos.
 * @author Jorge Berjano
 */
public class HerramientaCirculo extends HerramientaBase {

    private EditorDocumento editor;
    private Circulo circulo;
    private Point puntoBase;
    private Point puntoExtremo;
    private Cruz cruz = new Cruz();
    private Flecha flecha = new Flecha();    

    public HerramientaCirculo(EditorDocumento editor) {
        this.editor = editor;
    }

    @Override
    public boolean pulsado(MouseEvent e) {
        this.circulo = new Circulo();
        puntoBase = e.getPoint();
        Point2D.Double centro = editor.getConversor().aUnidadesReales(puntoBase);
        circulo.setCentro(centro);
        return true;
    }

    @Override
    public boolean arrastrando(MouseEvent e) {
        actualizarForma(e.getPoint());
        return true;
    }

    @Override
    public boolean liberado(MouseEvent e) {
        if (puntoBase.equals(e.getPoint())) {
            return false;
        }
        actualizarForma(e.getPoint());
        editor.finalizarCreacionForma(circulo);
        circulo = null;
        puntoBase = null;
        puntoExtremo = null;
        return true;
    }

    private void actualizarForma(Point puntoActualRaton) {
        puntoExtremo = puntoActualRaton;
        Point2D posicion = editor.getConversor().aUnidadesReales(puntoActualRaton);
        circulo.setRadio(posicion.distance(circulo.getCentro()));
    }

    @Override
    public Cursor getCursor() {
        return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
    }

    @Override
    public void pintarEnPixeles(Graphics2D graphics) {
        if (circulo == null) {
            return;
        }
        graphics.setColor(Color.BLACK);
        graphics.setXORMode(Color.WHITE);
        graphics.setStroke(new BasicStroke(1));

        cruz.setPunto(puntoBase);
        cruz.pintar(graphics);
        flecha.setCentro(puntoBase);
        flecha.setExtremo(puntoExtremo);
        flecha.pintar(graphics);

        Shape formaPixels = editor.getConversor().transformarAPixeles(circulo.getShape());
        graphics.draw(formaPixels);

        graphics.setPaintMode();
    }
}
